package cn.sc.summer.token.service;

import cn.sc.summer.token.enums.RequestTypeEnum;
import org.springframework.lang.NonNull;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 类名：RSA非对称加解密接口
 *
 * @author a-xin
 * @date 2024/5/11 15:14
 */
public interface EncryptService {

    /**
     * 校验此次请求路径是都需要加密数据
     *
     * @param request 请求体
     * @return 是否需要加密：true：需要加密，false：不需要加密
     */
    Boolean checkEncrypt(HttpServletRequest request);

    /**
     * 校验此次请求路径是都需要加密数据
     *
     * @param uri 请求路径，例如：/getUrl，/getRoute
     * @return 是否需要加密：true：需要加密，false：不需要加密
     */
    Boolean checkEncrypt(String uri);

    /**
     * 校验此次请求路径是都需要解密数据
     *
     * @param request 请求体
     * @return 是否需要加密：true：需要解密，false：不需要解密
     */
    Boolean checkDecrypt(HttpServletRequest request);

    /**
     * 校验此次请求路径是都需要解密数据
     *
     * @param uri 请求路径，例如：/getUrl，/getRoute
     * @return 是否需要加密：true：需要解密，false：不需要解密
     */
    Boolean checkDecrypt(String uri);

    /**
     * 返回数据选择性加密（根据配置文件与请求类型决策是否进行数据加密）
     *
     * @param request   请求体
     * @param sourceStr 原始数据
     * @return 加密后数据
     */
    String encrypt(HttpServletRequest request, String sourceStr);

    /**
     * 返回数据选择性加密（根据配置文件与请求类型决策是否进行数据加密）
     *
     * @param requestType 请求类型
     * @param sourceStr   原始数据
     * @return 加密后数据
     */
    String encrypt(String requestType, String sourceStr);

    /**
     * 返回数据选择性加密（根据配置文件与请求类型决策是否进行数据加密）
     *
     * @param requestTypeEnum 请求类型
     * @param sourceStr       原始数据
     * @return 加密后数据
     */
    String encrypt(RequestTypeEnum requestTypeEnum, String sourceStr);

    /**
     * 入参数据选择性解密（根据配置文件与请求类型决策是否进行数据解密）
     *
     * @param request   请求体
     * @param sourceStr 原始数据
     * @return 加密后数据
     */
    String decrypt(HttpServletRequest request, String sourceStr);

    /**
     * 入参数据选择性解密（根据配置文件与请求类型决策是否进行数据解密）
     *
     * @param requestType 请求类型
     * @param sourceStr   原始数据
     * @return 加密后数据
     */
    String decrypt(String requestType, String sourceStr);

    /**
     * 入参数据选择性解密（根据配置文件与请求类型决策是否进行数据解密）
     *
     * @param requestTypeEnum 请求类型
     * @param sourceStr       原始数据
     * @return 加密后数据
     */
    String decrypt(RequestTypeEnum requestTypeEnum, String sourceStr);

    /**
     * 加密openFeign调用参数
     *
     * @param data 需要加密信息
     * @return 加密后数据
     */
    String encryptFeignData(@NonNull String data);

    /**
     * 解密openFeign返回数据
     *
     * @param data 需要解密数据
     * @return 解密后数据
     */
    String decryptFeignData(@NonNull String data);

    /**
     * 加密数据
     *
     * @param data 需要加密数据
     * @return 加密后数据
     */
    String encryptData(@NonNull String data);

    /**
     * 解密数据
     *
     * @param data 需要解密数据
     * @return 解密后数据
     */
    String decryptData(@NonNull String data);

    /**
     * 获取所有解密白名单
     *
     * @return 解密白名单
     */
    List<String> getAllDecryptWhite();

    /**
     * 获取所有加密白名单
     *
     * @return 所有加密白名单
     */
    List<String> getAllEncryptWhite();

}
